﻿/*********************************************************************
 * Nombre: TratarListaParams.cs
 * Descripción: Clase encargada de tratar los parámetros que se envían.
 * Autor: DRD
 * Modificaciones:
 * ******************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BXPI
{
    public partial class TratarListaParams : Form
    {



        private int numParametrosUsuario = 0;
        private List<Parser.formulario> ListaForms = new List<Parser.formulario>();
        private List<string> ListaMods = new List<string>();
        public Parser Parser;
        private bool cambiado = true;//Inicializo a true para que realice la acción de updatear el grid al entrar
        ConfigurarCharset ventanaCharset;
        int contUsar;
        int contInyectable;

        public struct paramUser {
            public string nombre;
            public string valor;
            public string identificador;
        }

        List<paramUser> listaParamsUser = new List<paramUser>();

        /// <summary>
        /// Llama al parseador con la página que se ha introducido
        /// </summary>
        /// <param name="pagina"></param>
        public TratarListaParams(string pagina)
        {
            InitializeComponent();
            rellenarCombo();
            Parser = new Parser(pagina);
            ListaForms = Parser.getListaDeFormularios();
            ventanaCharset = new ConfigurarCharset(Parser);
        }

        /// <summary>
        /// Salta al apretar el botón aceptar, fija los valores.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void aceptarBtn_Click(object sender, EventArgs e)
        {
            if (comprobarGrid())
            {
                if (cadenaDis.Text != "" | checkBox1.Checked != false)
                {
                    cambiado = true;
                    for (int i = 0; i < listaParamsUser.Count(); i++)
                    {
                        Parser.anadirParametroUsuario(listaParamsUser[i].nombre, listaParamsUser[i].valor, listaParamsUser[i].identificador);
                    }
                    listaParamsUser.Clear();
                    actualizarListaMods();
                    ListaMods.Clear();
                    Parser.setListaDeFormularios(ListaForms);
                    Parser.setParams(cadenaDis.Text, cmbTipoInyec.Text);
                    this.DialogResult = DialogResult.OK;
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("Debe introducir una cadena discriminatoria.", "Cadena discriminatoria", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        /// <summary>
        /// Borra las listas sin actualizar al cancela
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cancelarBtn_Click(object sender, EventArgs e)
        {
            listaParamsUser.Clear();
            ListaMods.Clear();

            this.Hide();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TratarListaParams_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Rellena el grid de parámetros
        /// </summary>
        private void rellenarGrid()
        {
            string nombreBoton = "";

            gridParametros.Rows.Clear();
            for (int i = 0; i < ListaForms.Count; i++)
            {
                for (int j = 0; j < ListaForms[i].parametros.Count; j++)
                {
                    //Agregar valores al Grid
                    gridParametros.Rows.Add(ListaForms[i].parametros[j].identificador, ListaForms[i].parametros[j].usar, ListaForms[i].parametros[j].nombre, ConvertToHex(ListaForms[i].parametros[j].valor), ListaForms[i].parametros[j].inyectable);
                    numParametrosUsuario++;
                }

                for (int j = 0; j < ListaForms[i].botones.Count; j++)
                {
                    if (ListaForms[i].botones.Count > 0)
                    {
                        if (ListaForms[i].botones[j].nombre != "")
                        {
                            nombreBoton = ListaForms[i].botones[j].nombre;
                            gridParametros.Rows.Add(ListaForms[i].botones[j].identificador, ListaForms[i].botones[j].usar, nombreBoton, ListaForms[i].botones[j].valor, ListaForms[i].botones[j].inyectable);//Cuidado con esta línea
                        }
                        else if (ListaForms[i].botones[j].id != "")
                        {
                            nombreBoton = ListaForms[i].botones[0].id;
                            gridParametros.Rows.Add(ListaForms[i].botones[j].identificador, ListaForms[i].botones[j].usar, nombreBoton, ListaForms[i].botones[j].valor, ListaForms[i].botones[j].inyectable);//Cuidado con esta línea
                        }
                        numParametrosUsuario++;
                    }
                }
            }
        }

        /// <summary>
        /// Convierte los valores a formato URL
        /// </summary>
        /// <param name="asciiString"></param>
        /// <returns></returns>
        public string ConvertToHex(string asciiString)
        {
            asciiString=System.Web.HttpUtility.UrlEncode(asciiString);
            return asciiString;
        }

        /// <summary>
        /// Salta cuando se edita un campo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridParametros_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
        {
            bool existe = false;
            cambiado = true;
            if (gridParametros.CurrentRow.Index <= numParametrosUsuario-1)
            {
                foreach (string a in ListaMods) {

                    if (a == gridParametros.Rows[gridParametros.SelectedCells[0].RowIndex].Cells[0].Value.ToString())
                    {
                        existe = true;
                    }
                }
                if (!existe){
                    ListaMods.Add(gridParametros.Rows[gridParametros.SelectedCells[0].RowIndex].Cells[0].Value.ToString());
                }

            }

        }

        /// <summary>
        /// Actualiza en la lista los elementos modificados
        /// </summary>
        private void actualizarListaMods() {
            for (int i = 0; i < ListaMods.Count; i++)
            {
                for (int j = 0; j < gridParametros.Rows.Count; j++)
                {
                    if (ListaMods[i] == gridParametros.Rows[j].Cells[0].Value.ToString())
                    {
                        bool usarMarcado = false;
                        bool inyectMarcado = false;

                        if (gridParametros.Rows[j].Cells[1].Value.ToString().ToLower() == "true")
                        {
                            usarMarcado = true;
                        }
                        if (gridParametros.Rows[j].Cells[4].Value.ToString().ToLower() == "true")
                        {
                            inyectMarcado = true;
                            usarMarcado = true;
                        }

                        Parser.ModificarParametrosUser(gridParametros.Rows[j].Cells[0].Value.ToString(),
                                                       usarMarcado,
                                                       gridParametros.Rows[j].Cells[2].Value.ToString(),
                                                       gridParametros.Rows[j].Cells[3].Value.ToString(),
                                                       inyectMarcado);
                    }
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridParametros_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridParametros_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {

        }

        /// <summary>
        /// Muestra el diálogo de Añadir parámetro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addParamBtn_Click(object sender, EventArgs e)
        {
            AnadirParametro AnadirDlg = new AnadirParametro(this);
            AnadirDlg.ShowDialog();
        }

        /// <summary>
        /// Añade un nuevo parámetro al grid
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="valor"></param>
        public void AnadirParametro(string nombre, string valor) {
            paramUser paramU;
            string identificador = "u" + (numParametrosUsuario+1);
            gridParametros.Rows.Add(identificador , false, nombre, valor, false);
            paramU.identificador = identificador;
            paramU.nombre = nombre;
            paramU.valor = valor;
            listaParamsUser.Add(paramU);
            numParametrosUsuario++;
            cambiado = true;
        }

        /// <summary>
        /// Al cerrra el diálogo borra las listas
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TratarListaParams_FormClosing(object sender, FormClosingEventArgs e)
        {
            listaParamsUser.Clear();
            ListaMods.Clear();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TratarListaParams_Shown(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TratarListaParams_VisibleChanged(object sender, EventArgs e)
        {
            //Es llamado al entrar y al salir de la ventana.
            if (cambiado)
            {
                numParametrosUsuario = 0;
                rellenarGrid();
                cambiado = false;//Ahora sólo entrará al salir de la ventana
            }
        }

        /// <summary>
        /// Devuelve la lista de formularios
        /// </summary>
        /// <returns></returns>
        public List<Parser.formulario> getListaForms() {
            return ListaForms;
        }

        /// <summary>
        /// Cuando se cambia el estado del checkbox de la cadena discriminatoria
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                cadenaDis.Text = "";
                cadenaDis.Enabled = false;
            }
            else
                cadenaDis.Enabled = true;
        }

        /// <summary>
        /// Muestra el dialogo del charset al pulsar el botón Config Charset
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCharset_Click(object sender, EventArgs e)
        {
            
            ventanaCharset.ShowDialog();
            this.TopMost = true;
            this.TopMost = false;
        }

        /// <summary>
        /// Comprueba que se ha marcado un parámetro inyectable
        /// </summary>
        /// <returns></returns>
        private bool comprobarGrid() {
            contUsar = 0;
            contInyectable = 0;
            for (int i = 0; i < gridParametros.Rows.Count; i++) {
                if (gridParametros.Rows[i].Cells[1].Value.ToString().ToLower() == "true")
                {
                    contUsar++;
                }
                if (gridParametros.Rows[i].Cells[4].Value.ToString().ToLower() == "true")
                {
                    contInyectable++;

                }
            }
            if (contInyectable > 0)
            {
                if (contInyectable > 1) {
                    MessageBox.Show("Hay " + contInyectable + " parámetros inyectables seleccionados, desselecione "+ (contInyectable - 1) + ".","Demasiados inyectables", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return false;
                }
                return true;
            }
            else {
                MessageBox.Show("Debe seleccionar al menos un parámetro inyectable.", "Seleccione un inyectable", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

        /// <summary>
        /// Rellena el combo de elección del tipo de inyección
        /// </summary>
        private void rellenarCombo() {
            cmbTipoInyec.Items.Add("Entre comillas simples ' '");
            cmbTipoInyec.Items.Add("Entre comillas dobles \" \"");
            cmbTipoInyec.Items.Add("Sin entrecomillar (Numérico)");
            cmbTipoInyec.SelectedItem = "Entre comillas simples ' '";
        
        }

    }
}
